/*
 * 
 */
package co.edu.udistrital.erpgrid.web.trabajos.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.component.html.HtmlDataTable;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import co.edu.udistrital.erpgrid.bd.modelo.pojo.Estado;
import co.edu.udistrital.erpgrid.bd.modelo.pojo.GridNodo;
import co.edu.udistrital.erpgrid.exceptions.CrudException;
import co.edu.udistrital.erpgrid.exceptions.FinderException;
import co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio;

// TODO: Auto-generated Javadoc
/**
 * La Clase GridNodosBean. Bean para la captura de datos de la gestión de nodos.
 */
@Component(value = "gridBean")
@Scope("session")
public class GridNodosBean {
	

	/** El LOG. */
	private static org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(GridNodosBean.class);
	
	/**
	 * El servicio de trabajos
	 * @uml.property  name="trabajosServicioImpl"
	 * @uml.associationEnd  multiplicity="(0 -1)" elementType="co.edu.udistrital.erpgrid.bd.modelo.pojo.Estado"
	 */
	private transient ITrabajosServicio trabajosServicioImpl;
	
	/**
	 * El grid nodo a gestionar.
	 * @uml.property  name="gridNodo"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private GridNodo gridNodo;
	
	/**
	 * El grid nodo editar.
	 * @uml.property  name="gridNodoEditar"
	 * @uml.associationEnd  
	 */
	private GridNodo gridNodoEditar;
	
	/**
	 * El estado.
	 * @uml.property  name="estado"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private Estado estado;
	
	/**
	 * El estado editar.
	 * @uml.property  name="estadoEditar"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private Estado estadoEditar;

	/**
	 * El estados select.
	 * @uml.property  name="estadosSelect"
	 * @uml.associationEnd  multiplicity="(0 -1)" elementType="javax.faces.model.SelectItem"
	 */
	private List<SelectItem> estadosSelect;
	
	/**
	 * El nodos list.
	 * @uml.property  name="nodosList"
	 * @uml.associationEnd  multiplicity="(0 -1)" elementType="co.edu.udistrital.erpgrid.bd.modelo.pojo.GridNodo"
	 */
	private List<GridNodo> nodosList;
	
	/**
	 * Permite establecer si se recarga automaticamente la pagina de consultas
	 */
	private boolean monitorear=false;

	
	/**
	 * Nueva instancia de grid nodos bean.
	 *
	 * @param trabajosServicioImpl the trabajos servicio impl
	 */
	@Autowired
	public GridNodosBean(ITrabajosServicio trabajosServicioImpl) {
		super();
		this.trabajosServicioImpl = trabajosServicioImpl;
		init();
	}
	
	/**
	 * Inicia. los valores por defecto.
	 */
	public void init(){
		gridNodo = new GridNodo();
		estado = new Estado();
		estado.setIdEstado(0);
		estadoEditar = new Estado();
		estadoEditar.setIdEstado(0);
		List<Estado> estados = new ArrayList<Estado>();
		estadosSelect = new ArrayList<SelectItem>();
		try {
			estados = trabajosServicioImpl.consultarEstados();
			for (Estado estado : estados) {
				estadosSelect.add(new SelectItem(estado.getIdEstado().intValue(),estado.getNombre()));
			}
		} catch (FinderException e) {
			LOG.error(e.getMessage(),e);
		}
		
		//consultar Todos los nodos
		consultarTodos();
		
	}

	/**
	 * Consultar todos los nodos de la grilla
	 */
	public void consultarTodos() {
		nodosList = new ArrayList<GridNodo>();
		try {
			nodosList = trabajosServicioImpl.consultarTodosNodos();
		} catch (Exception e) {
			LOG.error(e.getMessage(),e);
		}
	}

	/**
	 * Crear un nodo de la grilla.
	 *
	 * @return el string
	 */
	public String crear(){
		//:TODO validar todo no nulo menos id
		LOG.info(gridNodo.getIp());
		try {
			int indice = trabajosServicioImpl.consultarIndice();
			gridNodo.setIndice(indice);
			gridNodo.setEstado(estado);
			trabajosServicioImpl.guardarNodos(gridNodo);
		} catch (CrudException e) {
			LOG.error(e.getMessage(),e);
			//agregar mensajes de faces
		}
		
		consultarTodos();
		return "volver";
	}
	
	
	/**
	 * Editar un nodo de la grilla
	 *
	 * @return el string
	 */
	public String editar(){
		//:TODO validar todo no nulo menos id
		LOG.info(gridNodoEditar.getIp());
		try {
			if(estadoEditar.getIdEstado()==1){
				int indice = trabajosServicioImpl.consultarIndice();
				gridNodoEditar.setIndice(indice);
			}
			
			gridNodoEditar.setEstado(estadoEditar);
			trabajosServicioImpl.guardarNodos(gridNodoEditar);
		} catch (CrudException e) {
			LOG.error(e.getMessage(),e);
			//agregar mensajes de faces
		}
		
		consultarTodos();
		return "volver";
	}
	
	
	/**
	 * Eliminar un nodo de la grilla.
	 */
	public void eliminar(){
		GridNodo seleccionado = establecerSeleccionado();
		if(seleccionado!=null){
			//:TODO validar todo no nulo menos id
			LOG.info(seleccionado.getId().toString());
			try {
				trabajosServicioImpl.eliminarNodos(seleccionado.getId());
			} catch (CrudException e) {
				LOG.error(e.getMessage(),e);
				//agregar mensajes de faces
			}
			nodosList.remove(seleccionado);
		}
	}
	
	/**
	 * Establecer seleccionado en la tabla de resultados.
	 *
	 * @return el grid nodo
	 */
	private GridNodo establecerSeleccionado() {
		GridNodo seleccionado = null;
		HtmlDataTable dataTable = (HtmlDataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("principal:nodosTable");
		if(dataTable!=null){
			seleccionado = (GridNodo) dataTable.getRowData();
		}
		estadoEditar = seleccionado.getEstado();
		return seleccionado;
	}
	
	/**
	 * Redireccionar crear.
	 *
	 * @return el string
	 */
	public String redirectCrear(){
		return "crear";
	}
	
	/**
	 * Redireccionar editar.
	 *
	 * @return el string
	 */
	public String redirectEditar(){
		gridNodoEditar = establecerSeleccionado();
		return "editar";
	}

	/**
	 * Obtiene el trabajos servicio impl.
	 * @return  el trabajos servicio impl
	 * @uml.property  name="trabajosServicioImpl"
	 */
	public ITrabajosServicio getTrabajosServicioImpl() {
		return trabajosServicioImpl;
	}

	/**
	 * Establece el trabajos servicio impl.
	 * @param trabajosServicioImpl  el nuevo trabajos servicio impl
	 * @uml.property  name="trabajosServicioImpl"
	 */
	public void setTrabajosServicioImpl(ITrabajosServicio trabajosServicioImpl) {
		this.trabajosServicioImpl = trabajosServicioImpl;
	}

	/**
	 * Obtiene el grid nodo.
	 * @return  el grid nodo
	 * @uml.property  name="gridNodo"
	 */
	public GridNodo getGridNodo() {
		return gridNodo;
	}

	/**
	 * Establece el grid nodo.
	 * @param gridNodo  el nuevo grid nodo
	 * @uml.property  name="gridNodo"
	 */
	public void setGridNodo(GridNodo gridNodo) {
		this.gridNodo = gridNodo;
	}

	/**
	 * Obtiene el estado.
	 * @return  el estado
	 * @uml.property  name="estado"
	 */
	public Estado getEstado() {
		return estado;
	}

	/**
	 * Establece el estado.
	 * @param estado  el nuevo estado
	 * @uml.property  name="estado"
	 */
	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	/**
	 * Obtiene el estados select.
	 *
	 * @return el estados select
	 */
	public List<SelectItem> getEstadosSelect() {
		return estadosSelect;
	}

	/**
	 * Establece el estados select.
	 *
	 * @param estadosSelect el nuevo estados select
	 */
	public void setEstadosSelect(List<SelectItem> estadosSelect) {
		this.estadosSelect = estadosSelect;
	}

	/**
	 * Obtiene el nodos list.
	 *
	 * @return el nodos list
	 */
	public List<GridNodo> getNodosList() {
		return nodosList;
	}

	/**
	 * Establece el nodos list.
	 *
	 * @param nodosList el nuevo nodos list
	 */
	public void setNodosList(List<GridNodo> nodosList) {
		this.nodosList = nodosList;
	}

	/**
	 * Obtiene el grid nodo editar.
	 * @return  el grid nodo editar
	 * @uml.property  name="gridNodoEditar"
	 */
	public GridNodo getGridNodoEditar() {
		return gridNodoEditar;
	}

	/**
	 * Establece el grid nodo editar.
	 * @param gridNodoEditar  el nuevo grid nodo editar
	 * @uml.property  name="gridNodoEditar"
	 */
	public void setGridNodoEditar(GridNodo gridNodoEditar) {
		this.gridNodoEditar = gridNodoEditar;
	}

	/**
	 * Obtiene el estado editar.
	 * @return  el estado editar
	 * @uml.property  name="estadoEditar"
	 */
	public Estado getEstadoEditar() {
		return estadoEditar;
	}

	/**
	 * Establece el estado editar.
	 * @param estadoEditar  el nuevo estado editar
	 * @uml.property  name="estadoEditar"
	 */
	public void setEstadoEditar(Estado estadoEditar) {
		this.estadoEditar = estadoEditar;
	}

	/**
	 * Establece si se monitorea la consulta de nodos
	 * @return the monitorear
	 */
	public boolean isMonitorear() {
		return monitorear;
	}

	/**
	 * Establecer si se monitorea o no la consulta de nodos
	 * @param monitorear the monitorear to set
	 */
	public void setMonitorear(boolean monitorear) {
		this.monitorear = monitorear;
	}
	
	

	
}
